//package com.yunhe.device.service.device.impl;
//
//import com.yunhe.device.domain.device.Analog;
//import com.yunhe.device.domain.device.Device;
//import com.yunhe.common.exception.ArgumentErrorException;
//import com.yunhe.common.exception.ObjectNotFoundException;
//import com.yunhe.common.exception.UniqueConstraintsException;
//import com.yunhe.device.repository.authority.ResourceTreeRepository;
//import com.yunhe.device.repository.device.DeviceRepository;
//import com.yunhe.device.service.device.AnalogService;
//import com.yunhe.device.service.device.DeviceService;
//import com.yunhe.common.util.StringUtil;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//import org.springframework.transaction.annotation.Transactional;
//
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
///**
// * 设备Service
// * @desc 设备服务类实现
// * @author liuronglei
// */
//@Service
//public class DeviceServiceImpl implements DeviceService {
//    @Autowired
//    private DeviceRepository deviceRepository;
//    @Autowired
//    private AnalogService analogService;
//    @Autowired
//    private ResourceTreeRepository resourceTreeRepository;
//
//    /**
//     * 设备对象处理和判断
//     * @param device 设备对象
//     */
//    private void processBeforeSave(Device device)
//            throws ArgumentErrorException, UniqueConstraintsException {
//        //判断code、name、title是否为空
//        if (device.getCode() == null || device.getTitle() == null) {
//            throw new ArgumentErrorException("代码、名称不能为空");
//        }
//        String code = String.valueOf(device.getCode());
//        //判断代码是否已存在
//        Device deviceByCode = this.findByCode(Long.valueOf(code));
//        if (deviceByCode != null) {
//            if (device.getId() == null || Long.valueOf(String.valueOf(deviceByCode.getId())) != Long.valueOf(String.valueOf(device.getId()))) {
//                throw new UniqueConstraintsException("已存在代码为" + code + "的设备");
//            }
//        }
//    }
//
//    /**
//     * 新增设备
//     * @param energyUnitId 能量单元ID
//     * @param device 新增对象
//     */
//    @Transactional
//    @Override
//    public Device createDevice(Long energyUnitId, Device device)
//            throws ArgumentErrorException, UniqueConstraintsException {
//        device.setId(null);
//        processBeforeSave(device);
//        return deviceRepository.create(energyUnitId, device);
//    }
//
//    /**
//     * 批量新增设备
//     * @param energyUnitId 能量单元ID
//     * @param deviceList 设备列表
//     */
//    @Transactional
//    @Override
//    public Iterable<Device> createDevice(Long energyUnitId, List<Device> deviceList)
//            throws ArgumentErrorException, UniqueConstraintsException {
//        List<Device> result = new ArrayList<>();
//        for (Device device : deviceList) {
//            result.add(createDevice(energyUnitId, device));
//        }
//        return result;
//    }
//
//    /**
//     * 根据id删除设备
//     * @param energyUnitId 能量单元ID
//     * @param deviceId 设备ID
//     */
//    @Transactional
//    @Override
//    public void deleteDevice(Long energyUnitId, Long deviceId) {
//        resourceTreeRepository.unbindResource(energyUnitId, deviceId);
//        deviceRepository.deleteById(deviceId);
//    }
//
//    /**
//     * 更新设备（更新全部字段）
//     * @param device 要更新的设备对象
//     */
//    @Transactional
//    public Device updateDevice(Device device)
//            throws ArgumentErrorException, UniqueConstraintsException, ObjectNotFoundException {
//        Long id = device.getId();
//        boolean exists = id != null && deviceRepository.existsById(id);
//        if (!exists) {
//            throw new ObjectNotFoundException("找不到ID为" + id + "的设备");
//        }
//        processBeforeSave(device);
//        return deviceRepository.update(device);
//    }
//
//    /**
//     * 根据ID获得设备对象
//     * @param deviceId 设备ID
//     */
//    @Override
//    public Device findByDeviceId(Long deviceId) {
//        return deviceRepository.findById(deviceId);
//    }
//
//    /**
//     * 根据code获得设备对象
//     * @param code code
//     */
//    @Override
//    public Device findByCode(Long code) {
//        return deviceRepository.findByCode(code);
//    }
//
//    /**
//     * 根据电站ID获得设备对象列表
//     * @param stationId 电站ID
//     */
//    @Override
//    public Iterable<Device> findByStationId(Long stationId) {
//        return deviceRepository.findByStationId(stationId);
//    }
//
//    /**
//     * 根据电站ID获得设备对象列表（带分类）
//     * @param stationId 电站ID
//     */
//    @Override
//    public Map<String, List<Object>> findByStationIdForGroup(Long stationId) {
//        List<Device> list = deviceRepository.findByStationId(stationId);
//        return getDeviceGroup(list);
//    }
//
//    /**
//     * 根据电站ID和设备类型获得设备对象列表
//     * @param stationId 电站ID
//     * @param type 设备类型
//     */
//    @Override
//    public Iterable<Device> findByStationIdAndType(Long stationId, String type) {
//        return deviceRepository.findByStationIdAndType(stationId, type);
//    }
//
//    /**
//     * 根据能量单元ID获得设备对象列表
//     * @param energyUnitId 能量单元ID
//     */
//    @Override
//    public Iterable<Device> findByEnergyUnitId(Long energyUnitId) {
//        return deviceRepository.findByEnergyUnitId(energyUnitId);
//    }
//
//    /**
//     * 根据单位ID获得设备对象列表
//     * @param firmId 单位ID
//     */
//    @Override
//    public Iterable<Device> findByFirmId(Long firmId) {
//        return deviceRepository.findByFirmId(firmId);
//    }
//
//    /**
//     * 根据能量单元ID获得设备对象列表（带分类）
//     * @param energyUnitId 能量单元ID
//     */
//    @Override
//    public Map<String, List<Object>> findByEnergyUnitIdForGroup(Long energyUnitId) {
//        List<Device> list = deviceRepository.findByEnergyUnitId(energyUnitId);
//        return getDeviceGroup(list);
//    }
//
//    /**
//     * 根据能量单元ID和设备类型获得设备对象列表
//     * @param energyUnitId 能量单元ID
//     * @param type 设备类型
//     */
//    @Override
//    public Iterable<Device> findByEnergyUnitIdAndType(Long energyUnitId, String type) {
//        return deviceRepository.findByEnergyUnitIdAndType(energyUnitId, type);
//    }
//
//    /**
//     * 根据设备ID获得点号列表
//     * @param deviceId 设备ID
//     */
//    @Override
//    public Iterable<Analog> findAnalogs(Long deviceId) {
//        List<Long> devIdList = new ArrayList<>();
//        devIdList.add(deviceId);
//        return analogService.findAnalogsByDevId(devIdList);
//    }
//
//    /**
//     * 根据设备ID和子设备标签以及点号类型获得点号列表
//     * @param deviceId 设备ID
//     * @param childType 子设备标签
//     * @param pdtCodeList 点号类型
//     */
//    @Override
//    public Iterable<Analog> findChildAnalogs(Long deviceId,
//                                             String childType,
//                                             List<Long> pdtCodeList) {
//        return analogService.findChildAnalogsDevIdAndType(deviceId, childType, pdtCodeList);
//    }
//
//    /**
//     * 根据设备ID获得其连接关系的指定设备类型的设备列表
//     * @param deviceId 设备ID
//     * @param type 设备类型
//     */
//    @Override
//    public List<Device> findByConnectRelation(Long deviceId, String type) {
//        return deviceRepository.findByConnectRelation(deviceId, type);
//    }
//
//    /**
//     * 将设备列表按设备类型分组
//     * @param list 设备列表
//     */
//    private Map<String, List<Object>> getDeviceGroup(List<Device> list) {
//        Map<String, List<Object>> result = new HashMap<>();
//        if (list != null) {
//            for (Device node : list) {
//                String type = node.getType();
//                if (!StringUtil.isEmpty(type)) {
//                    List<Object> nodeList = result.computeIfAbsent(type, k -> new ArrayList<>());
//                    nodeList.add(node);
//                }
//            }
//        }
//        return result;
//    }
//}
